Skip to main content

对话框:项目设置: 静态分析灯

象征: _cds_icon_stat_analy_light.png

功能:对话框激活使用轻量级版本执行的检查 CODESYS 每次生成代码时进行静态分析。

称呼项目 → 项目设置 命令, 静态分析灯 类别

提示

您可以通过使用标记代码从静态代码分析中排除代码行 {analysis ...} 语用或 {attribute 'analysis' := '...'} 语用。

有关更多信息,请参阅: 静态分析代码

额外的编译检查

SA0033:未使用的变量

检测已声明但未在编译程序代码中使用的变量

对于 GVL 变量:如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下方的对象。如果只有一个应用程序,则 POUs 视野也受到影响。

SA0028:重叠的内存区域

检测两个或多个变量保留相同内存的代码行

例如,以下声明会发生这种情况: var1 AT %QB21: INTvar2 AT %QD5: DWORD.在这种情况下,两个变量都使用字节 21,这意味着变量的内存范围重叠。

SA0006:来自多个任务的写访问

检测由多个任务写入的变量

SA0004:输出上的多写访问

检测写入多个位置的输出

注意:当输出变量 (VAR_IN_OUT) 被写入不同的分支 IFCASE 陈述。

注意:编译指示不能禁用此规则。

SA0027:标识符的多种用途

检测项目范围内变量或对象 (POU) 的名称/标识符的多次使用

. 检测到以下情况:
  • 枚举常量的名称与应用程序中的另一个枚举或包含库中使用的名称相同。

  • 变量的名称与应用程序中的对象名称或集成库的名称相同。

  • 变量的名称与应用程序中枚举中的枚举常量名称或集成库的名称相同。

  • 一个对象的名称与应用程序中另一个对象的名称相同。

  • 变量的名称与方法的名称相同。

  • 对象的名称与上级对象(“父对象”)的名称相同。

SA0167:报告临时 FunctionBlock 实例

检查检测声明为临时变量的功能块实例。这会影响在方法或函数中声明的实例,或者 VAR_TEMP,因此在每个处理周期或每个 POU 调用中重新初始化。

SA0175:对字符串的可疑操作

默认不活动

检测 UTF-8 编码可疑的代码位置

包括以下结构:

  • 对单字节字符串的索引访问

    例子: str[2]

    信息: 对字符串的可疑操作:索引访问“<表达式>”

  • 对单字节字符串的地址访问

    例子: ADR(str)

    信息: 对字符串的可疑操作:可能的索引访问“<表达式>”

  • 调用标准库的字符串函数 除了 CONCATLEN

    信息: 对字符串的可疑操作:可能的索引访问“<表达式>”

  • 包含非 ASCII 字符的单字节文字

    例子:

    str := '99€';

    str := 'Ä';

    信息: 对字符串的可疑操作:文字“<literal>”包含非 ASCII 字符

根据检查结果,建议不要启用 字符串的 UTF8 编码 编译选项。

有关更多信息,请参阅: 编译选项

544. 例子

SA0003:空语句

;
(* Comment *);
iVar;

SA0006:并发访问

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0004:输出上的多写访问

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ;
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

SA0006:来自多个任务的写访问

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  // Controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //Controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

SA0027:名称的多次使用

PROGRAM PLC_PRG
VAR
    ton : INT; // error SA0027
END_VAR

SA0029:代码中的符号与声明不同

一个 PLC_PRG POU 和一个 fnc (函数) POU 存在于设备树中。

PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
ivar := iVar + 1; // notation different to that in the declaration part ->   SA0029
_123TEST_var_ := _123test_var_INT; // notation different to that in the declaration part ->   SA0029
Fnc(); // notation different to that in the devices tree ->   SA0029

SA0167:报告临时 FunctionBlock 实例

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR

FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH: INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR


有关更多信息,请参阅: 静态分析代码